import java.io.Serializable;

/**
 * Fecha de Creacion: 14 de noviembre de 2011
 * Descripcion:		Clase Atomo representa a un objeto atomo que puede estar contenido dentro de una lista
 * 					Un Atomo puede contener valores booleanos, numeros o strings, pero solamente uno de ellos
 * 					a la vez
 * 
 * 
 */

/**
 * @author Medrano, Debroy
 *
 */
public class Atomo implements Serializable {
	
	/**
	 * esNumero     indica si este atomo contiene o no un numero
	 * 				True: Si contiene un numero
	 * 				False: No contiene un numero
	 */
	boolean esNumero;
	
	/**
	 * esString		 indica si este atomo contiene o no un numero
	 * 				True: Si contiene un numero
	 * 				False: No contiene un numero
	 */
	boolean esString;
	
	/**
	 * esBooleano	Indica si este atomo contiene o no un valor booleano
	 * 				True: Si contiene un valor booleano
	 * 				False:	No contiene un valor booleano
	 */
	boolean esBoolean;
	
	/**
	 * esDouble		Indica si esta atomo contiene o no un valor Double
	 * 				True: Si contiene un valor double
	 * 				False: No contiene un vallor double
	 */
	boolean esDouble;
	
	
	/**
	 * numero 		Contiene el valor numero de este atomo, si es un numero
	 */
	int numero;
	
	/**
	 * valor		Contiene el valor String de este atomo, si es un String
	 */
	String valor;
	
	/**
	 * booleano		Contiene l valor Boolean de este atomo, si es un Boolean
	 */
	boolean booleano;
	
	/**
	 * decimal		Contiene el valor decimal de este atomo
	 */
	double decimal;
	
	
	/**
	 * Atomo 		Constructor: Crear un numero atomo a partir de un String
	 * @param atom
	 */	
	public Atomo(String atom){
		try{
			decimal = Double.parseDouble(atom);
			esNumero = true;
			esString = false;
			esBoolean = false;
			esDouble = true;
		}catch(Exception e){
			valor = atom;
			esString = true;
			esNumero=false;
			esBoolean = false;
			esDouble = false;
		}	
		
	}
	
	/**
	 * Atomo		Constructor: Permite crear un nuevo objeto a partir de un double
	 * @param d		double que esta contenido en este atomo
	 */
	public Atomo(double d){
		decimal = d;
		esNumero = true;
		esString = false;
		esBoolean = false;
		esDouble = true;
	}
	
	/**
	 * Atomo		Constructor: crea un nuevo Atomo a partir de un numero entero
	 * @param numero	Valor entero de este atomo
	 */
	public Atomo (int numero){
		this.numero = numero;
		esNumero=true;
		esString = false;
	}
	
	/**
	 * Atomo		Constructor: crea un nuevo Atomo a partir de un valor booleano
	 * @param buleano
	 */
	public Atomo (boolean buleano){
		this.booleano=buleano;
		esNumero=false;
		esString=false;
		esBoolean=true;
	}
	
	/**
	 * isNumero			Permite saber si este atomo contiene un valor numerico
	 * @return
	 */
	public boolean isNumero(){
		return esNumero;
	}
	
	/**
	 * isDouble			Permite saber si este atomo contiene un valor Double
	 * @return
	 */
	public boolean isDouble(){
		return esDouble;
	}
	
	
	/**
	 * isBoolean		Permite saber si este atomo contiene un valor booleano.
	 * @return
	 */
	public boolean isBoolean(){
		return esBoolean;
	}
	
	/**
	 * setValorBoolean		Permite establecer el valor booleano de este atomo, e indicar que ahora es tipo booleano
	 * @param bool
	 */
	public void setValorBoolean(boolean bool){
		this.booleano=bool;
		esBoolean = true;
		esNumero= false;
		esDouble = false;
		esString = false;
	}
	
	
	/**
	 * setValorEntero		Permite establecer el valor numerico de este atomo, e indicar que ahora es tipo numerico
	 * @param entero
	 */
	public void setValorEntero(double entero){		
		decimal = entero;		
		esNumero=true;
		esDouble=true;
		esString=false;
		esBoolean=false;
	}
	
	/**
	 * isString		Permite saber si este Atomo contiene un String
	 * @return		boolean
	 */
	public boolean isString(){
		return esString;
	}
	
	/**
	 * getNumero		Permite obtener el valor numerico de este Atomo, si es un numero
	 * @return
	 */
	public Double getNumero(){
		if(esNumero || esDouble){
			return decimal;
		}else{
			return null; 
		}		
	}
	
	/**
	 * getBoolean		Permite obtener el valor booleano que contiene este Atomo, si es booleano
	 * @return			boolean	booleano
	 */
	public boolean getBoolean(){
		return this.booleano;
	}
	
	/**
	 * getString		Permite obtener el valor String que contiene este Atomo, si es un String
	 * @return
	 */
	public String getString(){
		return valor;
	}
	
	/**
	 * toString			Permite obtener una descripcion del estado actual de este atomo
	 */
	public String toString(){
		if(esNumero || esDouble){
			return ""+decimal;
		}else if(esString){
			return valor;
		}else{
			if(booleano){
				return "T";
			}else{
				return "NIL";
			}
		}
	}
	
	
	
	
	

}
